package db;

import java.sql.*;
import java.util.ConcurrentModificationException;

public class TestDriverDB {

    /**
     * 数据库中的修改----版本时区的修改
     * set global time_zone = '+8:00';　 ##修改mysql全局时区为北京时间，即我们所在的东8区
     *   set time_zone = '+8:00'; 　##修改当前会话时区
     *   flush privileges; 　 ##立即生效
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("=======jdbc连接数据库操" +
                "面向过程的数据库连接操作==============");
        test01();

        System.out.println("=======jdbc连接数据库操" +
                "面向对象的数据库连接操作==============");
        test02();
    }
    /**
     * jdbc连接数据库操作
     * 面向对象的数据库连接操作
     */

    public  static void test02(){

        try{
            //创建一个查询器的实例对象
            DBProvider dbProvider = new DBProvider();

            //(4) 准备数据库的SQL语句，用于处理业务逻辑；
            String strSql = "select * from student";

            // (5) 使用查询器执行SQL语句，如果是查询操作，则会返回一个ResultSet结果集；
            ResultSet resultSet = dbProvider.query(strSql);

            // (6) 遍历ResultSet结果集对象，获取数据库中的数据，进行相关的业务逻辑处理；
            if (resultSet !=null){
                while (resultSet.next()){
                    //从ResultSet中取出当前游标遍历行的数据
                    System.out.println(resultSet.getObject(2));
                    //数据操作相关的下边都是从1开始的，而不是从0 开始的
                }
            }
            System.out.println("==================================================");
            //游标指针重头开始遍历，从最开始的位置，重新放置到第一行数据集之前
            resultSet.beforeFirst();
            //关闭连接
            // connection.close();
            //遍历结果集
            if (resultSet !=null){
                while (resultSet.next()){
                    //从ResultSet中取出当前游标遍历行的数据
                    System.out.println(resultSet.getObject(2));
                    //数据操作相关的下边都是从1开始的，而不是从0 开始的
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * jdbc连接数据库操作
     * 面向过程的数据库连接操作
     */

    public static  void test01(){

        //(0)准备数据库连接的相关参数

        //数据库的驱动类的名字，包，路径名
        String strDriverName4Mysql8 = "com.mysql.cj.jdbc.Driver";
        String strDriverName4Mysql5 = "com.mysql.jdbc.Driver";
        String strDriverName4Oracle = "oracle.jdbc.driver.OracleDriver";

        //数据库服务器的连接串
        //连接串的localhost 127.0.0.1 ip地址，服务器名，表示服务器的访问路径 3306 mysql数据库服务器监听的端口号
        String strURL4Mysql8 = "jdbc:mysql://localhost:3306/tjise2021325?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true";
        String strURL4Mysql5 = "jdbc:mysql://localhost:3306/tjise2021325?useUnicode=true&characterEncoding=utf8";
        String strURL4Oracle = "jdbc:oracle:thin:@localhost:1521:orcl";

        //登录数据库的用户名和密码
        String strUserName = "root";
        String strUserPsw = "111111";

        try{
            // (1) 加载数据库驱动类；【使用反射】【可以省略】
            //如果jvm中没有数据库驱动类Driver实例对象，会自动根据连接串类型加载数据库驱动类的实例。
            //Class.forName(strDriverName4Mysql8);这一行可以不用写，jvm会自动加载

            //(2) 通过DriverManager类的静态方法获取数据库的连接对象Connection；
           Connection connection = DriverManager.getConnection(strURL4Mysql5,strUserName,strUserPsw);

            //(3) 通过数据库连接对象获取查询器 Statement ；
            Statement statement = connection.createStatement();

            //(4) 准备数据库的SQL语句，用于处理业务逻辑；
            String strSql = "select * from student";

           // (5) 使用查询器执行SQL语句，如果是查询操作，则会返回一个ResultSet结果集；
            ResultSet resultSet = statement.executeQuery(strSql);

           // (6) 遍历ResultSet结果集对象，获取数据库中的数据，进行相关的业务逻辑处理；
            if (resultSet !=null){
                while (resultSet.next()){
                    //从ResultSet中取出当前游标遍历行的数据
                    System.out.println(resultSet.getObject(2));
                    //数据操作相关的下边都是从1开始的，而不是从0 开始的
                }
            }
            System.out.println("==================================================");
            //游标指针重头开始遍历，从最开始的位置，重新放置到第一行数据集之前
            resultSet.beforeFirst();
            //关闭连接
           // connection.close();
            if (resultSet !=null){
                while (resultSet.next()){
                    //从ResultSet中取出当前游标遍历行的数据
                    System.out.println(resultSet.getObject(2));
                    //数据操作相关的下边都是从1开始的，而不是从0 开始的
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
